/**
 * 存储用户信息：token、个人信息
 */
import { loginApi,getUserInfoApi,getUserDetailByIdApi } from '@/api/user'
import { setToken, getToken, removeToken } from '@/utils/auth'
import {resetRouter} from '@/router'
export default {
  // 模块化加锁
  namespaced: true,
  // 1. 定义变量
  state: {
    // 先从本地cookie获取token，作为变量默认值
    token: getToken() || '',
    // 存储用户信息变量
    userInfo:{}
  },
  // 2. 修改变量(同步)
  mutations: {
    /**
     * 存储token
     * @param {*} state 所有变量
     * @param {*} token 调用setToken方法传入的参数
     */
    setToken(state, token) {
      // 1.内存存一份
      state.token = token
      // 2.防止刷新没了，在硬盘存储一份
      setToken(token)
    },
    // 删除token->退出登录
    delToken(state) {
      state.token = ''
      removeToken()
    },
    // 存储用户信息
    setUserInfo(state,info) {
      state.userInfo = info
    },
    // 删除用户信息
    delUserInfo(state) {
      state.userInfo = {}
    }
  },
  // 3. 调用后台接口发请求（异步）
  actions: {
    /**
    * 调用登录接口并存储token
    * @param {*} ctx 上下文
    * @param {*} loginForm 调用loginAction方法传入的参数
    */
    async loginAction(ctx, loginForm) {
      // 1.发请求获取token
      const token = await loginApi(loginForm)
      // console.log('登录成功的token：',token)
      // 2.存储token
      // ctx.commit === this.$store.commit
      ctx.commit('setToken',token)
    },
    // 获取当前登录人信息
    async getUserInfoAction({commit}, loginForm) {
      // 1.获取用户个人信息,无头像
      const userInfo = await getUserInfoApi()
      // console.log('获取用户个人信息',userInfo)
      // 2.获取用户头像
      // userInfo.userId上一个接口返回的用户id
      const avatorInfo = await getUserDetailByIdApi(userInfo.userId)
      // console.log('用户头像信息',avatorInfo)
      // {...userInfo,...avatorInfo}合并两个对象的数据并存到vuex
      commit('setUserInfo',{...userInfo,...avatorInfo})
      // 返回当前登录人的权限数据
      return userInfo.roles
    },
    // 退出登录
    logoutAction({commit}) {
      // 删除token和用户信息
      commit('delToken')
      commit('delUserInfo')
      // 1.重置路由
      resetRouter()
      // 2.清除菜单数据，留下静态路由
      commit('menus/setList',[],{ root: true })
    }
  }
}